package com.boot.config;

import com.boot.bean.Cat;
import com.boot.bean.Pet;
import com.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Configuration:本身也是一个组件
 * <p>
 * proxyBeanMethods: 代理Bean的方法
 * <p>
 * FuLL (proxyBeanMethods = true)   会产生代理对象 -- 单实例
 * Lite (proxyBeanMethods = false)  不会产生代理对象 -- 多实例
 * <p>
 * 组件有依赖：选择proxyBeanMethods = true   存在性能问题
 * 组件无依赖：选择proxyBeanMethods = false   不存在性能问题
 */
@Configuration(proxyBeanMethods = false)

/**
 *  开启Cat配置绑定功能
 *  将 Cat自动注入容器
 */
@EnableConfigurationProperties(Cat.class)
public class MyConfig {

    /**
     * 外部无论对配置类中的组件注册方法调用多少次获取的都是之前注册到容器的单实例对象
     *
     * @return
     * @ConditionalOnBean(name = "tom") 当容器中存在tom这个组件才会生效
     */
    @ConditionalOnBean(name = "tom")
    @ConditionalOnClass(Pet.class)
    @Bean
    public User getUser() {
        User zhangsan = new User("zhangsan", 18);
        // user组件依赖了pet组件
        zhangsan.setPet(getPet());
        return zhangsan;
    }

    //@Bean("tom")
    public Pet getPet() {
        return new Pet("tomcat");
    }

    @ConditionalOnMissingClass({"mycat-com.boot.bean.Cat"})
    @Bean("mycat-com.boot.bean.Cat")
    public Cat getCat() {
        return new Cat("BYD", 1000);
    }
}
